package com.situ.day22.generic;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class Demo {
    @Test
    public void test1() {
        List list = new ArrayList();
        list.add("Java");
        list.add(1);

        String str = (String) list.get(0);
    }

    @Test
    public void test2() {
        List<String> list = new ArrayList<>();
        list.add("Java");
        //泛型要解决的就是在编译时期报错，提前检查
        //list.add(1);

        //可以避免频繁类型转化
        String str = list.get(0);
    }

    @Test
    public void test3() {
        //<>两端的数据类型要一直
        List<Object> list1 = new ArrayList<Object>();
        List<String> list2 = new ArrayList<String>();
        //右边的泛型可以不写
        List<String> list3 = new ArrayList<>();
        //只写右边泛型是不起作用
        List list4 = new ArrayList<String>();
        list4.add(1);

        //两边不一致编译时候报错
        //List<Object> list5 = new ArrayList<String>();
        //泛型里面必须是引用数据类型
        //List<int> list6 = new ArrayList<>();
    }

    // add  insert save
    //'save(List<Student>)' clashes with 'save(List<Teacher>)'; both methods have same erasure
    /*public void save(List<Student> list) {

    }

    public void save(List<Teacher> list) {

    }*/

    /**
     * list集合只能处理 Double/Float/Integer等类型
     * 限定元素范围：元素的类型要继承自Number类  (上限)
     * @param list
     */
    public void save1(List<? extends Number> list) {
    }

    @Test
    public void testGeneric23() throws Exception {
        List<Double> list1 = new ArrayList<Double>();
        List<Float> list2 = new ArrayList<Float>();
        List<Integer> list3 = new ArrayList<Integer>();

        List<String> list4 = new ArrayList<String>();

        // 调用
        save1(list1);
        save1(list2);
        save1(list3);
        //save1(list4);
    }

    /**
     * super限定元素范围：必须是String父类   【下限】
     * @param list
     */
    public void save2(List<? super String> list) {
    }

    @Test
    public void testGeneric24() throws Exception {
        // 调用上面方法，必须传入String的父类
        List<Object> list1 = new ArrayList<Object>();
        List<String> list2 = new ArrayList<String>();

        List<Integer> list3 = new ArrayList<Integer>();
        save2(list1);
        save2(list2);
        //save2(list3);
    }

    public void save3(List<?> list) {
        // 只能获取、迭代list;  不能编辑list
        for (Object o : list) {
            System.out.println(o);
        }
        //list.add("java");
    }


    @Test
    public void testGeneric25() throws Exception {
        List<String> list1 = new ArrayList();
        list1.add("php");
        list1.add("java");
        save3(list1);

        List<Integer> list2 = new ArrayList();
        list2.add(1);
        list2.add(2);
        save3(list2);

    }
}
